/*  ---------------------------------------------------
	聊天
    --------------------------------------------------- */

var aa = '<div class="botui-message-left"><div class="botui-message-content-img" style="max-width: 40%;" onclick="originalImage(this)">';
var b = '</div></div>';
var cc = '<div class="botui-message-right"><div class="botui-message-content2-img" style="max-width: 40%;" onclick="originalImage(this)">';

var host = location.host;
//var host = "192.168.1.22:8080";

var wsHost = "ws://" + host + "/websocket";

var emojiPath = 'dist/img/';
var emojiHead = '<img class="emoji_icon" src="' + emojiPath;
var textHead = '⇤';
var emojiFoot = '">';
var textFoot = '⇥';

var socket;
/*
var focus = false;
window.onfocus = function() {
    focus = false;
};
window.onblur = function() {
    focus = true;
};

// for IE
document.onfocusin = function() {
    focus = false;
};
document.onfocusout = function() {
    focus = true;
};
*/

if (!window.WebSocket) {
	window.WebSocket = window.MozWebSocket;
};

if (window.WebSocket) {
	//alert('连接  --WebSocket：' + wsHost);
	// 连接
	socket = new WebSocket(wsHost);
	// 讯息接收
	socket.onmessage = function(event) {
		var data = JSON.parse(event.data)
		var msg = data.msg;
		var us_type = data.us_type;
		var nick = data.sendUser;
		var play_sound = jQuery("#play_sound").val();
		/*alert('连接  -- focus：' + focus);
		if (focus) {// FIXME ADD 静音判断
			if (play_sound == 0) {
				playSound();
				notifyMe(data); // 发送讯息通知
			}
		}*/
		switch (data.type) {
			case 'init':
				if (msg != null || msg != "") {
					var color = data.color;
					//alert("讯息接收: " + msg + "/" + nick + "/" + shakeStatus);
					setSystemMessage(nick + '：' + msg, color);
				}
				break;

			case 'msg':
				setMessageInnerHTML(us_type, nick, text2Emoji2(msg));
				break;

			case 'img':
				setImgInnerHTML(us_type, nick, msg);
				break;

			default:
				break;
		}
	}

	// 连接发生错误的回调方法
	socket.onerror = function() {
		//alert('连接发生错误的回调方法');
		jQuery('div.empty-error').slideDown(500).delay(4000).slideUp(500);
	};

	// 连接成功建立的回调方法
	socket.onopen = function(event) {
		//alert('连接成功建立的回调方法');
		jQuery('div.empty-ok').slideDown(500).delay(4000).slideUp(500);
	}

	//连接关闭的回调方法
	socket.onclose = function() {
		setSystemMessage('服务器连接关闭，请重新连接。', 'text-red');
		//jQuery('div.empty-name').slideDown(500).delay(4000).slideUp(500);
		jQuery("#footer").animate({
			bottom: '-200px'
		}, 400);
	}

	//监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
	window.onbeforeunload = function() {
		socket.close();
	}


} else {
	jQuery('div.empty-pwd').slideDown(500).delay(4000).slideUp(500);
	//alert("系统不支持 WebSocket ！无法进行连线。");
};

// 系统讯息
function setSystemMessage(msg, color) {
	var c =
		'<div class="botui-message-center"><div class="botui-message-system shake-constant shake-constant--hover" >';

	jQuery("#message").append(c + '<i class="fa fa-exclamation-circle fa-lg ' + color + ' "></i>&nbsp;' + msg + b);
	scrollToEnd(); // 发送消息后自动滚到底部

	jQuery(".botui-message-system").animate({
		'margin-right': '0px'
	}, 200);
}

// 系统讯息[ YES / NO ]
function setSystemMessageYN(msg, color) {
	var c =
		'<div id="msg-yn" class="botui-message-center"><div class="botui-message-system shake-constant shake-constant--hover" >';

	jQuery("#message").append(c + '<i class="fa fa-question-circle fa-lg ' + color + ' "></i>&nbsp;' + msg + b);
	scrollToEnd(); // 发送消息后自动滚到底部

	jQuery(".botui-message-system").animate({
		'margin-right': '0px'
	}, 200);
}

// *****进入诊室*****
jQuery("#talk-login1").on("click", function(event) {

	var room = jQuery("#room").val();
	var name = jQuery("#nick").val();
	var us_id = jQuery("#us_id").val();// 病患ID
	var do_id = jQuery("#do_id").val();// 医师ID
	var room_user_id = jQuery("#room_user_id").val();// 上线用户ID

	if (name == "") {
		jQuery('div.empty-msg').slideDown(500).delay(4000).slideUp(500);
		return;
	}

	// 信息得到验证 - 发送表单
	var url = "/ws/judgeNick";
	var urlData = {
		room: room,
		nick: name,
		us_id: us_id,
		do_id: do_id,
		room_user_id: room_user_id
	};

	jQuery.post(url, urlData,
		function(data) {
			//jQuery("#nickname").val("");
			if (data.code == 1) {
				// 房间存在但是用户重复
				sendnick(name, room, us_id, do_id, room_user_id);
				//jQuery('div.empty-name').slideDown(500).delay(4000).slideUp(500);
				return;

			} else {
				// 表示房间不存在 - 建立或进入
				sendnick(name, room, us_id, do_id, room_user_id);
			}
		}, "json"
	);

});

//发送姓名和连接ID(房间号)
function sendnick(nick, room, us_id, doid, room_user_id) {
	var map = new Map();
	map.set("type", "init");
	map.set("nick", nick);
	map.set("room", room);
	map.set("us_id", us_id);
	map.set("do_id", doid);
	map.set("room_user_id", room_user_id);

	jQuery("#room").val(room);

	var message = Map2Json(map);
	socket.send(message);

	// HTML
	jQuery('#text').html('')

	// 替换背景色
	jQuery("#talkBody").attr("class", "background-pink2");

	// 隐藏确认选单
	jQuery("#window").attr("class", "window-b");

	// 显示对话框物件
	jQuery("#footer").animate({
		bottom: '0px',
		width: '100%'
	}, 400);

	// 显示对话框
	jQuery("#message").show();

	// 因为该方法会引起较近的动画卡顿，所以让他先老实一会儿
	setTimeout(function() {
		loadEmoji();
	}, 500);
};

//通知用户约诊
jQuery("#talk-login2").on("click", function(event) {
	alert("FIXME 通知用户约诊");
});

// 发送讯息
jQuery("#talk-send").on("click", function(event) {
	send();
});

// 清空屏幕
jQuery("#talk-clear").on("click", function(event) {
	jQuery("#message").empty();
});

// 关闭连接
jQuery("#over").on("click", function(event) {
	setSystemMessageYN(
		'您确定结束这次会诊吗？<br><a onclick="msg_yn_y()" href="#">[YES]</a> / <a onclick="msg_yn_n()" href="#">[NO]</a>',
		'text-red');
});

// 确定结束这次会诊吗？ YN讯息 -N
function msg_yn_n() {
	jQuery("#msg-yn").empty();
}

// 确定结束这次会诊吗？ YN讯息 -Y
function msg_yn_y() {
	closeWebSocket();
	// FIXME 应该转向诊断记录页
	window.location.replace('user');
}

// 关闭连接
function closeWebSocket() {
	socket.close();
}

// 送出讯息
function send() {
	if (!window.WebSocket) {
		return;
	}
	var msgBak = jQuery('#text').html();
	var nick = jQuery('#nick').val();
	var us_type = jQuery('#us_type').val();
	var room_user_id = jQuery("#room_user_id").val();// 上线用户ID

	// 转换emoji
	jQuery(jQuery("#text").children(".emoji_icon")).each(function() {
		jQuery(this).prop('outerHTML', textHead + jQuery(this).attr("src").split(emojiPath)[1] + textFoot);
	});

	if (msgBak != null && msgBak != "") {
		msgBak = msgBak.replace(/"/g, "'");
		var map = new Map();
		map.set("room_user_id", room_user_id);
		map.set("us_type", us_type);
		map.set("type", "msg");
		map.set("msg", msgBak);

		var map2json = Map2Json(map);
		if (map2json.length < 8000) {
			socket.send(map2json);
			// 清空输入框
			jQuery('#text').html('')
			// 发送讯息给自己
			setMessageInnerHTML2(us_type, nick, text2Emoji2(msgBak));

		} else {
			// 文本太长了
			jQuery("#text").html(msgBak);
			setSystemMessage('讯息内容长度超过限制，尝试缩短一点内容。', 'text-red');
		}
	} else {
		// 发空消息
		setSystemMessage('很抱歉！空讯息无法发送。', 'text-red');
	}
}

// 将文本转换回emoji图片（显示与网页上）
function text2Emoji2(emojiMsg) {
	var tx = emojiMsg.replace(new RegExp(textHead, "g"), emojiHead).replace(new RegExp(textFoot, "g"), emojiFoot);
	return tx;
}

// 加载表情，这个方法需要一定时间，因此可能造成肉眼可见的卡顿
function loadEmoji() {
	jQuery("#text").emoji({
		button: "#emoji",
		showTab: true,
		animation: 'slide',
		icons: [{
            name: "表情",
            path: "dist/img/weibo/",
            maxNum: 93,
            file: ".png"
			/*name: "dog",
			path: "dist/img/dog/",
			maxNum: 37,
			file: ".png"*/
		}]
	});
}

// *****监听按键*****
jQuery(document).keydown(function(e) {
	// 回车键发送消息
	if (e.keyCode == 13) {
		var topValue = jQuery("#window").css('top');
		var topPx = topValue.substring(0, topValue.length - 2);
		if (topPx > 0) {
			send();
		} else {
			send();
			return false;
		}
	}
});

// JSON组装
function Map2Json(map) {
	var str = "{";
	map.forEach(function(value, key) {
		str += '"' + key + '"' + ':' + '"' + value + '",';
	})
	str = str.substring(0, str.length - 1)
	str += "}";
	return str;
}

// 将消息显示在网页上
function setMessageInnerHTML(us_type, nick, msg) {
	var mynick = jQuery('#nick').val();
	if (nick == mynick) {
		setMessageInnerHTML2(us_type, nick, msg);
		return;
	}
	
	var a =
		'<div class="botui-message-left"><div class="botui-message-content shake-constant shake-constant--hover">';
	var icon = setHeadIcon(us_type);

	jQuery("#message").append("<div class='sendUser'>" + icon + "&nbsp;" + nick + "</div>" + a + msg + b);
	scrollToEnd();
	jQuery(".botui-message-content").animate({
		'margin-left': '0px'
	}, 200);
}

// 将自己发的消息显示在网页上
function setMessageInnerHTML2(us_type, nick, msg) {
	var c =
		'<div class="botui-message-right"><div class="botui-message-content2 shake-constant shake-constant--hover">';
	var icon = setHeadIcon(us_type);
	
	jQuery("#message").append("<div class='sendUser' style='text-align: right;'>" + icon + "&nbsp;" + nick + "</div>" + c + msg + b);
	scrollToEnd();
	jQuery(".botui-message-content2").animate({
		'margin-right': '0px'
	}, 200);
}

// 定义头像标签
function setHeadIcon(us_type) {
	if (us_type != 0) {
		return '<i class="fa fa-user-md fa-lg text-red"></i>';
		
	} else {
		return '<i class="fa fa-user fa-lg text-blue"></i>';
	}
};

// *****选取图像*****
jQuery("#talk-sendImg").on("click", function(event) {
	// 模拟按下按钮
	jQuery("#image_send").click();
});

//var aa = '<div class="botui-message-left"><div class="botui-message-content-img" style="max-width: 40%;" onclick="originalImage(this)">';
// 查看原图
function originalImage(obj) {
	var _this = jQuery(obj);//将当前的pimg元素作为_this传入函数
	var style = _this.attr('style');
	if (style == 'max-width: 100%;') {
		_this.attr("style","max-width: 40%;");
	} else {
		_this.attr("style","max-width: 100%;");
	}
}

function imgShow(_this) {
	var style = _this.attr('style');
	
	if (style == 'max-width: 100%;') {
		jQuery("#originalImage").attr("style","max-width: 40%;");
		
	} else {
		jQuery("#originalImage").attr("style","max-width: 100%;");
	}
}

//将图片显示在网页上
function setImgInnerHTML(us_type, nick, msg) {
	var mynick = jQuery('#nick').val();
	if (nick == mynick) {
		setImgInnerHTML2(us_type, nick, msg);
		return;
	}
	
	var icon = setHeadIcon(us_type);
	jQuery("#message").append("<div class='sendUser'>" + icon + "&nbsp;" + nick + "</div>" + aa +
		"<img style=\"max-width: -moz-available;\" src='" + msg + "'" + b);
	scrollToEnd();

	jQuery(".botui-message-content-img").animate({
		'margin-left': '0px'
	}, 200);
}

//将自己发的图片显示在网页上
function setImgInnerHTML2(us_type, nick, msg) {
	var icon = setHeadIcon(us_type);
	jQuery("#message").append("<div class='sendUser' style='text-align: right;'>" + icon + "&nbsp;" + nick + "</div>" + cc +
		"<img style=\"max-width: -moz-available;\" src='" + msg + "'" + b);
	scrollToEnd();

	jQuery(".botui-message-content2-img").animate({
		'margin-right': '0px'
	}, 200);
}

// 送出图片
function sendImg(obj) {
	// 获取form
	var file = document.getElementById("imageUp");
	// 获取档案
	var image = document.getElementById("image_send");
	if (image.value != null || image.value != "") {
		// 送出的用户
		var nick = jQuery('#nick').val();
		var room = jQuery('#room').val();
		var us_type = jQuery('#us_type').val();
		var room_user_id = jQuery("#room_user_id").val();// 上线用户ID
		
		// 档案
		var fileData = image.files[0];
		var img = getObjectURI(fileData);
		setImgInnerHTML2(us_type, nick, img);

		//var form = new FormData(file);
		loadImage(image, 8192);
		upImgByLocalApi(room_user_id, us_type, fileData, room);
		image.value = null;
	}
};

// 要在本地显示的URI
function getObjectURI(fileData) {
	var url = null;
	if (window.createObjcectURL != undefined) {
		url = window.createOjcectURL(fileData);

	} else if (window.URL != undefined) {
		url = window.URL.createObjectURL(fileData);

	} else if (window.webkitURL != undefined) {
		url = window.webkitURL.createObjectURL(fileData);
	}
	return url;
}

// 使用系统本身接口上传图片
function upImgByLocalApi(room_user_id, us_type, file, room) {
	var formData = new FormData();
	formData.append("file", file);
	jQuery.ajax({
		type: 'post',
		url: '/ws/fileUpload?room=' + room,
		processData: false,
		contentType: false,
		data: formData,
		success: function(data) {
			var imgurl = data.url;

			if (imgurl != null && imgurl != "") {
				var map = new Map();
				map.set("room_user_id", room_user_id);
				map.set("us_type", us_type);
				map.set("type", "img");
				map.set("msg", imgurl);

				var map2json = Map2Json(map);
				socket.send(map2json);
			}
		},
		error: function(data) {
			setSystemMessage('上传图片失败，请重新上传！', 'text-red');
		}
	})
}

// 校验图片类型及大小
function loadImage(img, size) {
	var filePath = img.value;
	var fileExt = filePath.substring(filePath.lastIndexOf("."))
		.toLowerCase();

	if (!checkFileExt(fileExt)) {
		setSystemMessage('您上传的文件不是图片，请重新上传！', 'text-red');
		img.value = "";
		return;
	}
	if (img.files && img.files[0]) {
		if ((img.files[0].size / 1024).toFixed(0) > size) {
			setSystemMessage('图片不能超过限制的大小，请重新选择！', 'text-red');
			img.value = "";
			return;
		}
	} else {
		img.select();
		var url = document.selection.createRange().text;
		try {
			var fso = new ActiveXObject("Scripting.FileSystemObject");
		} catch (e) {
			// 如果你用的是ie8以下 请将安全级别调低！
			setSystemMessage('如果你用的是ie8以下的版本，请将安全级别调低！', 'text-red');
		}
	}
}

function checkFileExt(ext) {
	if (!ext.match(/.jpg|.jpeg|.gif|.png|.bmp/i)) {
		return false;
	}
	return true;
}

// 发送消息后自动滚到底部
function scrollToEnd() {
	var h = jQuery("html, body").height() - jQuery(window).height();
	jQuery("html, body").animate({
		scrollTop: h
	}, 200);
}


// 获得当前房间中的所有用户
function getOnlion(room, name) {
	jQuery.ajax({
		type : "POST",
		url : "/ws/online_user",
		data : {
			room : room,
			name : name
		},
		dataType : "json",
		success : function(data) {
			if (data.onlineUsera == 0) {

			} else {

			}
		}
	});
}

// 播放提示音
function playSound() {
	var borswer = window.navigator.userAgent.toLowerCase();
	if (borswer.indexOf("ie") >= 0) {
		//IE内核浏览器
		var strEmbed =
			'<embed name="embedPlay" src="./audio/ding.mp3" autostart="true" hidden="true" loop="false"></embed>';
		if (jQuery("body").find("embed").length <= 0)
			jQuery("body").append(strEmbed);
		var embed = document.embedPlay;

		//浏览器不支持 audion，则使用 embed 播放
		embed.volume = 100;
		//embed.play();

	} else {
		//非IE内核浏览器
		var strAudio = "<audio id='audioPlay' src='./audio/ding.mp3' hidden='true'>";
		if (jQuery("body").find("audio").length <= 0)
			jQuery("body").append(strAudio);
		var audio = document.getElementById("audioPlay");

		//浏览器支持 audion
		audio.play();
	}
}

// 讯息通知
function notifyMe(data) {
	var notification = null;
	var msg = data.msg;
	var nick = data.sendUser;
	var type = data.type;
	switch (type) {
		case 'init':
			notification = new Notification(nick, {
				body: msg,
				icon: 'http://' + host + '/icon/enter.png', // 通知讯息中的图标
			});
			break;

		case 'msg':
			notification = new Notification(nick, {
				body: msg,
				icon: 'http://' + host + '/icon/mail.png',
			});
			break;

		case 'img':
			notification = new Notification(nick, {
				icon: msg,
				// body: '你收到一张图片',
			});
			break;

		default:
			break;
	}

	// 先检查浏览器是否支持
	if (!("Notification" in window)) {
		setSystemMessage('您的系统不支持讯息通知，可能需要您自己多注意了。', 'text-red');
	}

	// 检查用户是否同意接受通知
	else if (Notification.permission === "granted") {
		// If it's okay let's create a notification
		var notification1 = notification;
		notification.onclick = function() {
			notification.close();
			window.resizeBy(-100, -100)
		};
	}

	// 否则我们需要向用户获取权限
	else if (Notification.permission !== 'denied') {
		Notification.requestPermission(function(permission) {
			// 如果用户同意，就可以向他们发送通知
			if (permission === "granted") {
				var notification1 = notification;
				notification.onclick = function() {
					notification.close();
					window.resizeBy(-100, -100)
				};
			}
		});
	}
	// 最后，如果执行到这里，说明用户已经拒绝对相关通知进行授权
	// 出于尊重，我们不应该再打扰他们了
}